#ifndef SIMULATION_MANAGER_H
#define SIMULATION_MANAGER_H

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/mobility-module.h"
#include "ns3/internet-module.h"
#include "ns3/applications-module.h"
#include "ns3/flow-monitor-module.h"
#include "ns3/wifi-module.h"
#include "ns3/point-to-point-module.h"
#include "data_manager.h"
#include "node_manager.h"
#include "link_manager.h"
#include "data_collector.h"
#include <string>
#include <vector>
#include <map>

namespace ns3 {

/**
 * @brief 模拟管理器类，负责控制整个仿真的流程
 */
class SimulationManager 
{
public:
  /**
   * @brief 构造函数
   */
  SimulationManager();
  
  /**
   * @brief 析构函数
   */
  ~SimulationManager();
  
  /**
   * @brief 初始化模拟
   * @return 初始化是否成功
   */
  bool Initialize();
  
  /**
   * @brief 运行模拟
   */
  void Run();
  
  /**
   * @brief 获取当前模拟的车辆ID
   * @return 当前车辆ID
   */
  uint32_t GetCurrentVehicleId() const;

private:
  /**
   * @brief 为单个车辆运行模拟
   * @param vehicleId 车辆ID
   */
  void RunSimulationForVehicle(uint32_t vehicleId);
  
  /**
   * @brief 设置模拟参数
   */
  void SetupSimulationParameters();

  /**
   * @brief 准备下一次模拟
   */
  void PrepareNextSimulation();

  /**
   * @brief 清理当前模拟
   */
  void CleanupSimulation();

  /**
   * @brief 清理旧的普通性能文件（非详细文件）
   */
  void CleanupOldPerformanceFiles();

  /**
   * @brief 打印模拟进度
   * @param vehicleId 车辆ID
   * @param percentage 完成百分比
   */
  void PrintSimulationProgress(uint32_t vehicleId, int percentage);

  /**
   * @brief 获取格式化的时间字符串
   * @param timePoint 时间点
   * @return 格式化的时间字符串
   */
  std::string GetTimeString(const std::chrono::time_point<std::chrono::high_resolution_clock>& timePoint) const;

private:
  DataManager m_dataManager;          ///< 数据管理器
  NodeManager m_nodeManager;          ///< 节点管理器
  LinkManager m_linkManager;          ///< 链接管理器
  DataCollector m_dataCollector;      ///< 数据收集器
  
  std::vector<uint32_t> m_vehicleIds; ///< 所有车辆ID列表
  uint32_t m_currentVehicleId;        ///< 当前正在模拟的车辆ID
  uint32_t m_simulationDuration;      ///< 模拟持续时间(秒)
  std::string m_resultsDir;           ///< 结果保存目录
};

} // namespace ns3

#endif // SIMULATION_MANAGER_H
